from django.shortcuts import render
from django.http.request import HttpRequest
from django.http.response import HttpResponse
# Create your views here.
from book.models import BookInfo, PeopleInfo


def index(request):
    return HttpResponse('ok')


# 启动shell工具
# python manage.py shell

#################增加数据############################
# 方法1
book = BookInfo()
book.name = 'python'
book.readcount=10
book.commentcount=100
book.pub_date ='1998-1-1'
book.save()
#方法2
BookInfo.objects.create(
    name='django',
    readcount=20,
    commentcount=30,
    pub_date='1890-1-1'
)


#############更新数据######################################

# 方法1
book = BookInfo.objects.get(id=7)
book.name = 'django1'
book.readcount =729
book.save()

#方法2  filter 查询到返回1 ，没有差寻到返回0
BookInfo.objects.filter(id=10).update(
    name ='django2',
    readcount = 728
)

#############删除数据######################################
# 方式1
book = BookInfo.objects.filter(id=7)
book.delete()

# 方式2
BookInfo.objects.filter(id=8).delete()



#############查询数据######################################
BookInfo.objects.get(id=1)
BookInfo.objects.get(name='python')

try:
    BookInfo.objects.get(name='python1')
except BookInfo.DoesNotExist as e:
    print('没有查询到')

BookInfo.objects.all()

BookInfo.objects.all().count()

# 查询编号为1的图书
BookInfo.objects.filter(id=1)

# 查询书名包含'湖'的图书
# 模型类名.objects.filter(属性名__运算符=值)
BookInfo.objects.filter(name__contains='p')

# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='部')

# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)

# 查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1,3,5])


# 查询编号大于3的图书 # gt 大于 great 大
# gte 大于等于  e equel 等于
# lt  小于 litte
# lte
BookInfo.objects.filter(id__gt=3)
BookInfo.objects.filter(id__gte=3)

# 查询1980年发表的图书
BookInfo.objects.filter(pub_date__year=1980)


# 查询1990年1月1日后发表的图书

BookInfo.objects.filter(pub_date__gte='1990-1-1')


################################# #
# 查询编号不等于3的图书
# **exclude**排除掉符合条件剩下的结果
# not

BookInfo.objects.exclude(id=3)


#Todo  查询对象F
from django.db.models import F
from django.db.models import F
# 查询阅读量和评论量相等的书籍

BookInfo.objects.filter(readcount__gte=F('commentcount'))

# Todo 多条件查询 11.查询--Q对象
from django.db.models import Q
# 并且 # filter().filter()
# 或者
# filter(属性名__运算符=值,属性名__运算符=值,...)
# 查询编号大于2 并且 阅读量大于20的图书

# Q对象的语法形式 # Q(属性名__运算符=值) # & 并且的意思
BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20)
BookInfo.objects.filter(Q(id__gt=2)&Q(readcount=20))

# | 或者 # 查询编号大于2 或者 阅读量大于20的图书
BookInfo.objects.filter(Q(id__gt=2)|Q(readcount=20))


# ~Q not 非 和exclude 类似 # 查询编号不等于3的图书
# **exclude**排除掉符合条件剩下的结果 # not
BookInfo.objects.filter(~Q(id__gt=2))


# TOdo 12.查询--聚合函数
from django.db.models import Max,Min,Avg,Count,Sum

BookInfo.objects.aggregate(Max('commentcount'))
BookInfo.objects.aggregate(Sum('commentcount'))

#TOdo 13.查询--排序
# 使用order_by对结果进行排序

# 默认是升序
BookInfo.objects.all().order_by('-commentcount')

# 属性名添加负号 表示 降序
BookInfo.objects.all().order_by('-commentcount')

# Todo 14.查询--关联查询

# 固定语法形式：
#  book.关联模型类名小写_set
# 获取所有的关联数据
#  book.关联模型类名小写_set.all()

book = BookInfo.objects.get(id=1)
book.peopleinfo_set.all()


# 14.2 由多到一的访问语法:多对应的模型类对象.多对应的模型类中的关系类属性名
person = PeopleInfo.objects.get(id=6)

person.book


# Todo 15.查询--关联过滤查询

# 15.1 由多模型类条件查询一模型类数据:


BookInfo.objects.filter(peopleinfo__name='东方不败')


# 查询所有描述信息中含有八的书籍信息
BookInfo.objects.filter(peopleinfo__description__contains='八')

# 查询所有书籍阅读量大于30的所有人物信息
PeopleInfo.objects.filter(book__readcount__gt=30)


PeopleInfo.objects.filter(book__name='天龙八部')

# TOdo 16.查询集QuerySet

book = BookInfo.objects.all()

# 这种每使用一次就会执行一次

# [book.id for book in BookInfo.objects.all()]

# 这种只会在赋值给book的时候会执行一次，之后再次执行都是调用book
book = [book.id for book in BookInfo.objects.all()]

# 16.3 限制查询集 切片不支持负数
# 对查询结果集进行切片的操作
# 查询前四个
BookInfo.objects.all()[0:4]

# 人物表中查询前8个，步长为2
PeopleInfo.objects.all()[1:8:2]

# 分页

from django.core.paginator import Paginator
books = BookInfo.objects.all()

# 两条数据一页
p = Paginator(books,per_page=2)
#获取第二页的数据
page2 = p.page(2)

# 一共有多少页
p.num_pages

#展示出来
page2.object_list